#ifndef POOL_HPP
#define POOL_HPP
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <list>

////////////////////////////////////////////////////////////
/// Defines
////////////////////////////////////////////////////////////
#define DEFAULT_POOL_SIZE 500

namespace smeg {
    namespace tools {

////////////////////////////////////////////////////////////
/// Template class for the Pool pattern
////////////////////////////////////////////////////////////
template <typename T>
class Pool
{
public:
    ////////////////////////////////////////////////////////////
    /// Constructor/Destructor
    ////////////////////////////////////////////////////////////
                                Pool( unsigned _uPoolSize = DEFAULT_POOL_SIZE );
                                ~Pool();

    ////////////////////////////////////////////////////////////
    /// Return the next available element
    ///
    /// \return The next available element
    ///
    ////////////////////////////////////////////////////////////
    T*                          Next();

    ////////////////////////////////////////////////////////////
    /// Push back a newly available element
    ///
    /// \param _pToFree :       Element to release
    ///
    ////////////////////////////////////////////////////////////
    void                        Release( T* _pToFree );

    ////////////////////////////////////////////////////////////
    /// Push back all elements as available
    ///
    ////////////////////////////////////////////////////////////
    void                        ReleaseAll();

private:
    typedef std::list< T* >     td_PoolList;

    /******************* Protected members ********************/
    unsigned                    m_uNumAvailableElements;
    td_PoolList                 m_PoolElements;
};

#include "Pool.inl"

    } // namespace tools
} // namespace smeg

#endif // POOL_HPP